import logging
import os
from sqlalchemy import inspect, create_engine, text
from sqlalchemy.exc import OperationalError
from sqlalchemy.orm import Session
from alembic.config import Config
from alembic import command

from app.db.session import SessionLocal, engine
from app.models.user import SysUsers
from app.core.security import get_password_hash
from app.core.config import settings

logger = logging.getLogger(__name__)

def init_db():
    """初始化数据库"""
    try:
        # 运行数据库迁移
        run_migrations()
        # 创建初始管理员用户
        create_admin_user()
        
        logger.info("数据库初始化完成")
    except Exception as e:
        logger.error(f"数据库初始化失败: {str(e)}")
        raise

def check_connection():
    """检查数据库连接"""
    try:
        # 尝试连接数据库
        with engine.connect() as conn:
            conn.execute(text("SELECT 1"))
        logger.info("数据库连接成功")
        return True
    except Exception as e:
        logger.error(f"数据库连接失败: {str(e)}")
        return False

def run_migrations():
    """运行数据库迁移"""
    try:
        # 先检查连接
        if not check_connection():
            logger.error("无法连接到数据库，请确保数据库已创建且配置正确")
            raise Exception("数据库连接失败")
        logger.info("执行数据库迁移...")
        # 获取alembic.ini文件的相对路径
        # 使用相对路径，相对于当前文件的位置向上两级找到alembic.ini
        current_dir = os.path.dirname(__file__)
        alembic_ini_path = os.path.join(current_dir, "..", "..", "alembic.ini")
        alembic_ini_path = os.path.normpath(alembic_ini_path)
        # 应用所有迁移
        alembic_cfg = Config(alembic_ini_path)
        command.upgrade(alembic_cfg, "head")  # 实际执行迁移到最新版本
        logger.info("数据库迁移完成")
    except Exception as e:
        logger.error(f"数据库迁移失败: {str(e)}")
        raise

def create_admin_user():
    """创建初始管理员用户（如果不存在）"""
    try:
        db = SessionLocal()
        try:
            logger.info("检查管理员用户是否存在...")
            admin = db.query(SysUsers).filter(SysUsers.user_name == 'admin').first()
            
            if not admin:
                logger.info("创建初始管理员用户...")
                admin_user = SysUsers(
                    user_name='admin',
                    real_name='系统管理员',
                    email='admin@example.com',
                    role=1,
                    status=1,
                    password=get_password_hash('admin123'),
                    create_by='system'
                )
                db.add(admin_user)
                db.commit()
                logger.info("初始管理员用户创建成功！")
            else:
                logger.info("管理员用户已存在，跳过创建")
        finally:
            db.close()
    except Exception as e:
        logger.error(f"创建管理员用户失败: {str(e)}")
        raise

if __name__ == "__main__":
    # 直接运行此文件时执行初始化
    init_db()